﻿#include <stdio.h>
#include <stdbool.h>
#include <time.h>


// 定义时间段类型枚举
typedef enum {
    PERIOD_UNKNOWN,      // 未知时间段
    PEAK_HIGH,           // 早晚高峰期
    PEAK_LOW,            // 小高峰期
    STEADY,              // 平稳期
    LOW                  // 低谷期
} PeriodType;

// 定义时间范围结构体
typedef struct {
    int start_hour;
    int start_min;
    int end_hour;
    int end_min;
    PeriodType type;
} TimeRange;

// 定义所有时间段
const TimeRange time_ranges[] = {
    // 早晚高峰期
    {8, 10, 8, 50, PEAK_HIGH},
    {17, 10, 17, 40, PEAK_HIGH},
    {18, 40, 19, 10, PEAK_HIGH},
    
    // 小高峰期
    {14, 0, 14, 40, PEAK_LOW},
    {16, 20, 17, 0, PEAK_LOW},
    {21, 10, 21, 40, PEAK_LOW},
    
    // 平稳期
    {7, 0, 7, 40, STEADY},
    {11, 0, 14, 0, STEADY},  // 注意：结束时间14:00与下个时间段开始时间相同
    {19, 10, 21, 10, STEADY},
    
    // 低谷期
    {6, 10, 7, 0, LOW},      // 注意：结束时间7:00与下个时间段开始时间相同
    {9, 30, 10, 50, LOW},
    {23, 40, 23, 50, LOW}
};

const int num_ranges = sizeof(time_ranges) / sizeof(time_ranges[0]);

// 检查当前时间是否在给定时间范围内
bool is_in_range(int hour, int min, const TimeRange* range) {
    // 将时间转换为分钟数
    int current_minutes = hour * 60 + min;
    int start_minutes = range->start_hour * 60 + range->start_min;
    int end_minutes = range->end_hour * 60 + range->end_min;
    
    // 处理跨午夜时间段（本例中没有跨午夜）
    if (end_minutes < start_minutes) {
        // 如果是跨午夜的时间段
        return current_minutes >= start_minutes || current_minutes <= end_minutes;
    }
    
    // 正常时间段判断
    return current_minutes >= start_minutes && current_minutes <= end_minutes;
}

// 获取当前时间段类型
PeriodType get_current_period(int hour, int min) {
    // 检查所有定义的时间段
    for (int i = 0; i < num_ranges; i++) {
        if (is_in_range(hour, min, &time_ranges[i])) {
            return time_ranges[i].type;
        }
    }
    
    // 默认返回低谷期
    return LOW;
}

// 将时间段类型转换为可读字符串
const char* period_type_to_string(PeriodType type) {
    switch (type) {
        case PEAK_HIGH: return "早晚高峰期";
        case PEAK_LOW:  return "小高峰期";
        case STEADY:     return "平稳期";
        case LOW:       return "低谷期";
        default:        return "未知时间段";
    }
}

// int main() {
//     // 测试不同时间段
//     int test_times[][2] = {
//         {8, 30},   // 早晚高峰期
//         {17, 30},  // 早晚高峰期
//         {14, 20},  // 小高峰期
//         {16, 30},  // 小高峰期
//         {12, 0},   // 平稳期
//         {20, 0},   // 平稳期
//         {6, 30},   // 低谷期
//         {10, 0},   // 低谷期
//         {23, 45},  // 低谷期
//         {3, 0}     // 未定义时间（默认低谷期）
//     };
    
//     int num_tests = sizeof(test_times) / sizeof(test_times[0]);
    
//     for (int i = 0; i < num_tests; i++) {
//         int hour = test_times[i][0];
//         int min = test_times[i][1];
//         PeriodType period = get_current_period(hour, min);
        
//         printf("时间 %02d:%02d 处于 %s\n", 
//                hour, min, period_type_to_string(period));
//     }

//     // 获取当前系统时间并判定其时间段
//     time_t now = time(NULL);
//     struct tm *local = localtime(&now);
//     int hour = local->tm_hour;
//     int min = local->tm_min;
//     PeriodType period = get_current_period(hour, min);
//     printf("当前系统时间 %02d:%02d 处于 %s\n", 
//             hour, min, period_type_to_string(period));
//     return 0;
// }